package cn.xinfei.xdecision.common.utils.exception.enums;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.Arrays;

@Slf4j
public enum ErrorCodeEnum {

    SERVER_ERROR(ErrorCodeEnum.ERROR_CODE + 101, "服务繁忙,请稍后再试!"),
    LOGIN_ERROR(ErrorCodeEnum.ERROR_CODE + 102, "登录失败"),
    ORGAN_IS_NULL(ErrorCodeEnum.ERROR_CODE + 130, "当前用户未指定组织，请联系管理员配置组织"),
    ERROR_TOKEN_EXPIRE(ErrorCodeEnum.ERROR_CODE + 103, "登录授权码已过期"),
    VAR_TYPE_REPEAT(ErrorCodeEnum.ERROR_CODE + 104, "变量类型已存在"),
    VAR_NAME_REPEAT(ErrorCodeEnum.ERROR_CODE + 105, "变量中文名已存在"),
    VAR_ADD_ERROR(ErrorCodeEnum.ERROR_CODE + 106, "变量添加异常"),
    VAR_UPDATE_ERROR(ErrorCodeEnum.ERROR_CODE + 107, "变量更新异常"),
    LIST_DB_NAME_REPEAT(ErrorCodeEnum.ERROR_CODE + 108, "黑白名单名称已存在"),
    VAR_TYPE_ERROR(ErrorCodeEnum.ERROR_CODE + 109, "变量类型错误"),
    VAR_EXIST_ERROR(ErrorCodeEnum.ERROR_CODE + 110, "变量已经存在"),
    VAR_DELETE_ERROR(ErrorCodeEnum.ERROR_CODE + 200, "变量删除异常"),
    VAR_COPY_ERROR(ErrorCodeEnum.ERROR_CODE + 201, "变量复制失败"),
    VAR_PARAM_ERROR(ErrorCodeEnum.ERROR_CODE + 202, "变量参数添加异常"),
    VAR_CODE_EXIST_ERROR(ErrorCodeEnum.ERROR_CODE + 203, "变量编码已经存在"),
    VAR_TYPE_EMPTY_ERROR(ErrorCodeEnum.ERROR_CODE + 204, "变量类型为空"),
    VAR_CODE_NAME_ERROR(ErrorCodeEnum.ERROR_CODE + 205, "变量编码不能以数字开头"),
    VAR_CODE_DEPENDENT_ERROR(ErrorCodeEnum.ERROR_CODE + 206, "变量被其他变量依赖，不能删除"),
    VAR_CODES_USED_IN_SNAPSHOT_ERROR(ErrorCodeEnum.ERROR_CODE + 207, "变量被衍生变量的快照依赖，不能删除"),
    VAR_RESUME_SNAPSHOT_ERROR(ErrorCodeEnum.ERROR_CODE + 208, "变量恢复快照异常"),
    VAR_MIGRATE_ERROR(ErrorCodeEnum.ERROR_CODE + 209, "变量迁移失败"),
    VAR_ENUM_LIST_ERROR(ErrorCodeEnum.ERROR_CODE + 210, "变量枚举查询异常"),
    VAR_INTERFACE_PRIVIDER_API_ERROR(ErrorCodeEnum.ERROR_CODE + 211, "接口变量关联信息provider,api 添加异常"),
    VAR_INTERFACE_STATUS__ERROR(ErrorCodeEnum.ERROR_CODE + 212, "接口源状态修改失败"),
    VAR_DEP_SEARCH_ERROR(ErrorCodeEnum.ERROR_CODE + 213, "变量依赖关系查询失败"),


    SCORECARD_NAME_REPEAT(ErrorCodeEnum.ERROR_CODE + 111, "评分卡名称已存在"),
    SCORECARD_CODE_REPEAT(ErrorCodeEnum.ERROR_CODE + 112, "评分卡代码已存在"),
    UN_PERMISSION(ErrorCodeEnum.ERROR_CODE + 113, "没有访问权限"),
    CREATE_USER_NAME_ERROR(ErrorCodeEnum.ERROR_CODE + 114, "姓名不能为超级管理员"),
    CREATE_USER_NAME_REPEAT(ErrorCodeEnum.ERROR_CODE + 115, "账号或员工编号已存在"),
    CREATE_ROLE_ADMIN_REPEAT(ErrorCodeEnum.ERROR_CODE + 116, "每个公司只能创建一个公司管理员"),
    CREATE_ROLE_NAME_REPEAT(ErrorCodeEnum.ERROR_CODE + 117, "角色名已存在"),
    CREATE_MENU_NAME_REPEAT(ErrorCodeEnum.ERROR_CODE + 118, "名称或编号已存在"),
    CREATE_ORGAN_NAME_REPEAT(ErrorCodeEnum.ERROR_CODE + 119, "名称或编号已存在"),

    UPDATE_RULE_ERROR(ErrorCodeEnum.ERROR_CODE + 120, "修改规则内容失败"),
    RULE_CONDITION_TYPE_ERROR(ErrorCodeEnum.ERROR_CODE + 121, "规则条件类型错误"),
    RULE_SAVE_ERROR(ErrorCodeEnum.ERROR_CODE + 122, "规则保存失败"),

    RULE_UPLOAD_ERROR(ErrorCodeEnum.ERROR_CODE + 123, "规则导入失败"),
    DECISION_CODE_REPEAT(ErrorCodeEnum.ERROR_CODE + 124, "代码已存在"),
    DECISION_SAVE_ERROR(ErrorCodeEnum.ERROR_CODE + 125, "保存失败"),
    DECISION_UPDATE_ERROR(ErrorCodeEnum.ERROR_CODE + 126, "修改状态失败"),
    DECISION_NAME_REPEAT(ErrorCodeEnum.ERROR_CODE + 127, "名称已存在"),
    ERROR_DECISION_VERSION(ErrorCodeEnum.ERROR_CODE + 140, "版本异常"),
    DECISION_SAVE_PRE_CHECK_ERROR_001(ErrorCodeEnum.ERROR_CODE + 141, "只能保存状态为‘新建’的版本"),
    DECISION_LOCK_ERROR_001(ErrorCodeEnum.ERROR_CODE + 142, "只能锁定状态为‘新建’的版本"),
    DECISION_REMOVE_ERROR(ErrorCodeEnum.ERROR_CODE + 143, "清空版本信息失败"),
    DECISION_COPY_ERROR(ErrorCodeEnum.ERROR_CODE + 144, "复制失败"),
    DECISION_VERSION_NEW_ERROR(ErrorCodeEnum.ERROR_CODE + 146, "新建版本失败"),
    DECISION_LOCK_ERROR_002(ErrorCodeEnum.ERROR_CODE + 147, "锁定规则失败"),
    DECISION_ID_CAN_NOT_NULL(ErrorCodeEnum.ERROR_CODE + 148, "id不能为空"),
    DECISION_CODE_CAN_NOT_NULL(ErrorCodeEnum.ERROR_CODE + 149, "code不能为空"),
    RECEIPT_CONCURRENT_OPERATE_ERROR(ErrorCodeEnum.ERROR_CODE + 150, "组件中心当前单据正在操作中，请勿重复操作！"),
    COMPONENT_TYPE_ERROR(ErrorCodeEnum.ERROR_CODE + 151, "组件中心类型不存在！"),
    NODE_TYPE_ERROR(ErrorCodeEnum.ERROR_CODE + 152, "保存节点时，nodeType类型在依赖关系类中不存在！"),
    NODE_JSON_ERROR(ErrorCodeEnum.ERROR_CODE + 153, "更新决策流节点信息时，nodeJson参数有误，请核验！"),
    SIZE_TOO_LONG(ErrorCodeEnum.ERROR_CODE + 154, "数组长度不能超过200！"),
    SEARCH_ERROR(ErrorCodeEnum.ERROR_CODE + 155, "查询失败！"),
    COMPONENT_NOT_EXIST(ErrorCodeEnum.ERROR_CODE + 156, "组件不存在！"),
    VAR_REL_ERROR(ErrorCodeEnum.ERROR_CODE + 157, "查询变量的依赖关系失败！"),
    VAR_ERROR(ErrorCodeEnum.ERROR_CODE + 158, "查询变量失败！"),
    NAME_CAN_NOT_BE_NULL(ErrorCodeEnum.ERROR_CODE + 159, "名称必填！"),


//    DECISION_TREE_SAVE_ERROR(ErrorCodeEnum.ERROR_CODE + 130, "决策树保存失败"),
//    DECISION_TREE_UPDATE_ERROR(ErrorCodeEnum.ERROR_CODE + 131, "决策树修改状态失败"),
//    ERROR_DECISION_TREE_VERSION(ErrorCodeEnum.ERROR_CODE + 150, "决策树版本异常"),
//    DECISION_TREE_CODE_IS_NOT_NULL(ErrorCodeEnum.ERROR_CODE + 151, "决策树编号不能为空"),
//    DECISION_TREE_COPY_ERROR(ErrorCodeEnum.ERROR_CODE + 152, "决策树复制失败"),
//    DECISION_TREE_NAME_REPEAT(ErrorCodeEnum.ERROR_CODE + 153, "决策表名称已存在"),


    LIST_OPERATION_NAME_REPEAT(ErrorCodeEnum.ERROR_CODE + 132, "集合操作名称重复"),
    LIST_OPERATION_CODE_REPEAT(ErrorCodeEnum.ERROR_CODE + 133, "集合操作代码重复"),
    TAG_SAVE_ERROR(ErrorCodeEnum.ERROR_CODE + 134, "标签保存失败"),
    TAG_UPDATE_ERROR(ErrorCodeEnum.ERROR_CODE + 135, "标签修改状态失败"),

    // ========== 通用 权限模块 99-001-000 ==========
    AUTH_SSO_SYSTEM_ERROR("99001001", "sso 系统访问异常"),

    // ========== 通用 参数校验模块 99-002-000 ==========
    PARAM_CHECK_ERROR("99002001", "参数校验异常,原因:{}"),

    // ========== 通用 文件夹模块 99-003-000 ==========
    FOLDER_NAME_EXISTS("99003001", "文件夹命名重复"),
    FOLDER_DELETE_FAIL("99003002", "文件夹删除失败，只能删除空文件夹"),

    // ========== 决策平台 引擎管理模块 01-001-000 ==========
    ENGINE_NEW_STATE_VERSION_EXISTS("01001001", "已存在新建状态的版本"),
    ENGINE_CLEAR_ERROR("01001002", "只能清空状态为'新建'的版本"),
    ENGINE_DEPLOY_FAILED("01001003", "引擎部署失败"),
    ENGINE_CODE_ERROR("01001004", "引擎编码不合法,需要以{}开头，后接任意字母、数字、中划线、下划线、句点！"),
    ENGINE_CODE_EXISTS("01001005", "引擎编码已存在,{}"),
    ENGINE_NAME_EXISTS("01001006", "引擎名称已存在,{}"),
    ENGINE_SAVE_ERROR("01001007", "引擎创建失败"),
    ENGINE_NOT_EXISTS("01001008", "引擎不存在"),
    ENGINE_NODE_UPDATE_ERROR("01001009", "引擎节点更新失败"),
    ENGINE_NODE_LINK_ERROR("01001010", "引擎节点连线失败"),
    ENGINE_NODE_NOT_EXISTS("01001011", "引擎节点不存在,{}"),
    ENGINE_UNDEPLOY_FAILED("01001012", "引擎取消部署失败"),
    ENGINE_NODE_CODE_REPEAT("01001013", "引擎节点编码重复"),
    ENGINE_VERSION_NOT_EXISTS("01001014", "引擎版本不存在"),
    REVIEWED_CANNOT_BE_APPROVE("01001015", "审核人不可以是审批人"),
    CURRENT_VERSION_IS_ENABLE("01001016", "当前版本正在‘运行中’"),
    ENGINE_REMOVE_ERROR("01001017", "引擎删除失败"),
    NODE_JSON_PARSE_ERROR("01001018", "nodeJson转换异常,原因:{}"),
    NODE_INFO_ERROR("01001019", "节点配置信息异常,原因:{}"),
    CANNOT_BE_MODIFIED_VERSION_STATUS("01001020", "不能修改的版本状态:{}"),
    ENGINE_DELETE_ERROR("01001021", "引擎版本删除异常,原因:{}"),
    DECISION_FLOW_NODE_CHECK_ERROR("01001022", "决策流校验不通过,校验不通过节点名称:{},code:{},原因:{}"),
    DECISION_FLOW_CHECK_ERROR("01001023", "决策流校验不通过,原因:{}"),
    ENGINE_NODE_LINK_ERROR_001("01001024", "引擎节点连线失败,原因:{0}的父级与当前父级{1}不符，请排查！"),
    ENGINE_NODE_LINK_ERROR_002("01001025", "引擎节点连线失败,原因:{0}的版本和当前父级{1}的版本不一致，请排查！"),
    ENGINE_NODE_LINK_ERROR_003("01001026", "引擎节点连线失败,原因:重复连线，请排查！"),
    ENGINE_NODE_UPDATE_CONCURRENT("01001027", "节点正在编辑中,请稍后重试"),
    ENGINE_MUST_BE_EDIT_DOWN("01001028", "请先完成编辑后，重新操作！"),
    ENGINE_EDITING_SELF("01001029", "你有正在编辑的页面，请确认！"),
    ENGINE_EDITING_OTHER("01001030", "当前决策流正在被{0}编辑，请确认！"),
    ENGINE_CONCURRENT_OPERATE_ERROR("01001031", "当前引擎正在被别人操作，请稍后再试！"),
    ENGINE_IS_NOT_NEW("01001032", "当前引擎版本不是新建状态，不能编辑！"),
    ENGINE_POST_BLACK_LIST_ADD_ERROR("01001033", "引擎执行规则集时，调用黑名单接口异常！"),

    REQUEST_ID_AND_DECISION_ID_CAN_NOT_NULL("01001034", "请求流水号和决策流水号都不能为null"),

    ENGINE_POST_ACTION_ERROR("01001035", "引擎执行陪跑节点时接口异常！"),


    // ========== 决策平台 组件中心模块 通用 02-000-000 ==========
    COMPONENT_STATUS_UPDATE_ERROR("02000001", "修改状态失败.失败原因:{},失败组件编码:{}"),
    COMPONENT_NOT_EXISTS("02000002", "组件不存在,组件编码:{}"),
    COMPONENT_VERSION_LOCK_ERROR_1("02000003", "只能锁定【新建】状态的版本,当前版本状态:{}"),
    COMPONENT_VERSION_LOCK_ERROR_2("02000004", "锁定版本异常,版本号:{}"),
    COMPONENT_COPY_ERROR("02000005", "复制失败，失败组件编码:{}"),

    // ========== 决策平台 组件中心模块 规则库 02-001-000 ==========
    GENERAL_RULE_NAME_REPEAT("02001002", "普通规则名称已存在"),
    GENERAL_RULE_CODE_REPEAT("02001003", "普通规则代码已存在"),
    GENERAL_RULE_UPDATE_STATUS_ERROR("02001004", "只能保存状态为‘新建’的版本"),
    RULE_NOT_EXISTS("02001006", "规则不存在"),

    // ========== 决策平台 组件中心模块 决策树 02-002-000 ==========
    DECISION_TREE_CODE_ERROR("02002001", "普通规则编码不合法，需要以jcs_开头，后接任意字母、数字、中划线、下划线、句点！"),


    // ========== 决策平台 配置中心模块 拒绝码 06-001-000 ==========
    REJECT_CATEGORY_NAME_REPEAT("06001001", "类别重复添加"),
    REJECT_CODE_NAME_REPEAT("06001002", "拒绝码重复添加"),
    REJECT_BRANCH_CODE_ATTR_PARAM_ERROR("06001003", "拒绝分支码属性参数错误"),
    REJECT_BRANCH_NAME_PARAM_ERROR("06001004", "拒绝分支码只允许填写数字"),
    REJECT_DIVERSION_NAME_PARAM_ERROR("06001005", "导流标签只允许填写字母或数字"),
    REJECT_DIVERSION_WEIGHTS_PARAM_ERROR("06001006", "导流标签权重只允许填写数字[1-99]"),
    REJECT_BRANCH_NAME_REPEAT("06001007", "拒绝码分支码重复添加"),
    REJECT_BRANCH_DISPLAY_NAME_REPEAT("06001008", "拒绝码分支码已存在，请检查类别,明细,拒绝码,分支码的合并字段"),
    REJECT_DIVERSION_NAME_REPEAT("06001009", "导流标签重复添加"),
    REJECT_CODE_NOT_FIND("06001010", "拒绝码未找到"),

    INCOMPLETE_COMPONENT_INFORMATION(ErrorCodeEnum.ERROR_CODE + 554, "组件信息不完整"),
    PARAMS_EXCEPTION(ErrorCodeEnum.ERROR_CODE + 555, "参数异常"),
    CLASS_CAST_EXCEPTION(ErrorCodeEnum.ERROR_CODE + 556, "类型转换异常"),
    JSON_CAST_EXCEPTION(ErrorCodeEnum.ERROR_CODE + 557, "JSON转换异常"),
    NULL_POINT_EREXCEPTION(ErrorCodeEnum.ERROR_CODE + 558, "NPE问题，请联系管理员"),
    DATA_IS_NOT_EXIST(ErrorCodeEnum.ERROR_CODE + 559, "数据不存在"),
    SECTION_ERROR(ErrorCodeEnum.ERROR_CODE + 560, "区间有误"),

    SCORECARD_NOT_SESECT(ErrorCodeEnum.ERROR_CODE + 561, "在本条路径上，评分卡节点有空值"),
    NODECHILD_NOT_SESECT(ErrorCodeEnum.ERROR_CODE + 562, "在本条路径上，子引擎节点有空值"),
    DECISION_TABLES_NOT_SELECT(ErrorCodeEnum.ERROR_CODE + 563, "在本条路径上，决策表节点有空值"),
    FOLDER_NOT_EXIST(ErrorCodeEnum.ERROR_CODE + 564, "文件夹不存在"),

    UPDATE_INTERFACE_ERROR(ErrorCodeEnum.ERROR_CODE + 565, "修改接口内容失败"),
    INTERFACE_CONDITION_TYPE_ERROR(ErrorCodeEnum.ERROR_CODE + 566, "接口条件类型错误"),
    INTERFACE_SAVE_ERROR(ErrorCodeEnum.ERROR_CODE + 567, "接口保存失败"),
    INTERFACE_NAME_REPEAT(ErrorCodeEnum.ERROR_CODE + 568, "接口名称已存在"),
    FAIL_IN_LINK(ErrorCodeEnum.ERROR_CODE + 600, "失败"),
    SQL_VARIABLE_HAVE_RISK(ErrorCodeEnum.ERROR_CODE + 601, "存在有风险sql关键词"),

    VARIABLE_UPLOAD_ERROR(ErrorCodeEnum.ERROR_CODE + 602, "导入失败"),


    // runner
    SUCCESS("00000000", "执行成功"),
    GET_REDIS_SOURCE_ERROR(ErrorCodeEnum.ERROR_CODE + 401, "获取Redis数据源失败"),
    GET_DATABASE_FIELD_ERROR(ErrorCodeEnum.ERROR_CODE + 402, "获取数据库指标失败"),
    RUNNER_CUSTOM_ERROR(ErrorCodeEnum.ERROR_CODE + 403, "执行自定义失败"),
    CODE_GENERATE_ERROR(ErrorCodeEnum.ERROR_CODE + 420, "code生成工具类报错"),
    GET_INTERFACE_FIELD_ERROR(ErrorCodeEnum.ERROR_CODE + 410, "获取接口指标错误");

    /**
     * 默认ERROR_CODE.<br>
     * 按公司要求8位长度，前两位产品。
     */
    public static final String ERROR_CODE = "01000";

    private final String code;
    private final String message;

    ErrorCodeEnum(String code, String message) {
        this.code = code;
        this.message = message;
    }

    public String getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    public static ErrorCodeEnum fromCodeOrThrow(String code) {
        if (StringUtils.isBlank(code)) {
            return null;
        }
        return Arrays.stream(ErrorCodeEnum.values())
                .filter(item -> code.equals(item.getCode()))
                .findFirst().orElseThrow(() -> new RuntimeException("no such error code:" + code));
    }

}